1 Motivación del trabajo

La motivación de este trabajo es la elaboración de un modelo predictivo que permita estimar, con la mayor precisión posible, los salarios anuales de jugadores de la NBA. Para ello, se utiliza un dataset con distitnas variables relativas a una serie de jugadores de la NBA, y siguiendo las etapas típicas de un proyecto de predicción, se intenta implementar el mejor modelo predictivo.

2 Etapas del proceso

Las fases de la investigación son las estudiadas en clase y se asemejan al siguiente diagrama:

En primer lugar, se realiza un análisis exploratorio de los datos, en este caso poniendo primro el foco en las variables cuantitativas, y más tarde en las categóricas.

Después, en la fase de ingeniería de variables, se modifican algunas de las variables existentes con el fin de transformar los datos disponibles y hacer que encajen mejor en los modelos.

Posteriormente, se plantean una serie de modelos, basados en parte en el análisis exploratorio así como en algoritmos de selección de variables.

Tras el planteamiento de los primeros modelos, se pasa a evaluar la precision de éstos, y se elige aquel que tenga mejor capacidad predictiva. Ese mismo modelo se evalúa de nuevo, y se plantea nuevamente ingeniería de variables con el objetivo de tratar de refinar el modelo, y mejorar la predicción.

Finalmente, se evalua el modelo final sobre una muestra de los datos y se valoran sus métricas.

2.1 Contrastes de hipótesis.

Es importante recordar que para que los modelos funcionen correctamente, es necesario verificar que se cumplen una serie de supuestos, tales como:

  • Normalidad

  • Homocedasticidad

  • Ausencia de multicolinealidad

  • Linealidad

No obstante, estas comprobaciones son propias de modelos descriptivos, y el caso que ocupa a este trabajo es el desarrollo de un modelo predictivo. Por esta razón, no se llevan a cabo este tipo de contrastes, ni se pone el foco en la capacidad explicativa del modelo, sino que se valoran sus capacidades predictivas.

2.1.1 Glosario de términos.

A continuación se incluye la descripción de cada una de las variables del dataset, utilizando la materia de clase y el apartado de estadísticas de la página web de la NBA.

  • Player: nombre y apellidos del jugador.
  • Salary: salario anual, la variable dependiente y la que se busca predecir, medido en dólares.
  • NBA_Country: nacionalidad del jugador.
  • NBA_DraftNumber: el número de draft del jugador, es decir, en qué puesto entró en la NBA.
  • Age: edad del jugador.
  • Tm: nombre de su equipo.
  • G: partidos que ha jugado en la temporada regular de 82 partidos.
  • MP: minutos jugados en toda la temporada.
  • PER: medida de eficiencia del jugador estandarizada sobre la media de la liga (15).
  • TS%: porcentaje de aciertos de cualquier tipo de tiro.
  • 3PAr: porcentaje de triples que el jugador tira respecto a sus tiros de campo totales.
  • FTr: porcentaje de tiros libres tirados respecto a sus tiros de campo totales.
  • ORB%: porcentaje de rebotes ofensivos que el jugador consigue.
  • DRB%: porcentaje de rebotes defensivos que el jugador consigue.
  • TRB%: porcentaje de rebotes que el jugador consigue, en general.
  • AST%: porcentaje de tiros de compañeros que el jugador ha asistido.
  • STL%: porcentaje de robos de un jugador respecto a los robos totales de su equipo.
  • BLK%: porcentaje de tapones del jugador respecto a los de su equipo.
  • TOV%: porcentaje de jugadas que acaban en turnover (recuperación).
  • USG%: porcentaje de uso, las jugadas en las que el jugador interviene respecto al total de jugadas de su equipo.
  • OWS: estimacion de las victorias que se deben a la habilidad ofensiva del jugador.
  • DWS: estimacion de las victorias que se deben a la habilidad defensiva del jugador.
  • WS: estimación de las victorias que se deben a la habilidad general del jugador.
  • WS/48: normalicacion de WS por cada 48 minutos. Por cada 48 minutos de juego del jugador, cuantas victorias genera.
  • OBPM: estimación de los puntos ofensivos de cada 100 posesiones en los cuales el jugador ha contribuido más que la media de la liga, traducido a la media del equipo.
  • DBPM: estimación de los puntos defensivos de cada 100 posesiones en los cuales el jugador ha contribuido más que la media de la liga, traducido a la media del equipo.
  • BPM: estimación de los puntos generales de cada 100 posesiones en los cuales el jugador ha contribuido más que la media de la liga, traducido a la media del equipo.
  • VORP: mide el rendimiento de un jugador contra el que daria un “jugador medio”.

3 Análisis exploratorio

library(dplyr)
library(broom)
library(ggcorrplot)
library(Hmisc)
library(car)
library(plotly)

Como ya se ha comentado, la primera parte consiste en un análisis exploratorio de los datos.

# Importacion de los datos
nba <- read.csv("./data/nba.csv")

# Dimensiones del dataframe
dim(nba) # 458 observaciones, 28 variables 
## [1] 485  28
glimpse(nba) # vistazo rapido a las variables
## Rows: 485
## Columns: 28
## $ Player          <chr> "Zhou Qi", "Zaza Pachulia", "Zach Randolph", "Zach ...
## $ Salary          <int> 815615, 3477600, 12307692, 3202217, 3057240, 131261...
## $ NBA_Country     <chr> "China", "Georgia", "USA", "USA", "USA", "USA", "US...
## $ NBA_DraftNumber <int> 43, 42, 19, 13, 10, 62, 62, 62, 23, 35, 62, 6, 40, ...
## $ Age             <int> 22, 33, 36, 22, 20, 24, 30, 23, 30, 23, 27, 24, 27,...
## $ Tm              <chr> "HOU", "GSW", "SAC", "CHI", "POR", "DAL", "BOS", "M...
## $ G               <int> 16, 66, 59, 24, 62, 79, 2, 5, 70, 45, 42, 70, 77, 6...
## $ MP              <int> 87, 937, 1508, 656, 979, 2238, 7, 118, 2200, 430, 4...
## $ PER             <dbl> 0.6, 16.8, 17.3, 14.6, 8.2, 11.5, -4.9, 0.9, 11.1, ...
## $ TS.             <dbl> 0.303, 0.608, 0.529, 0.499, 0.487, 0.543, 0.000, 0....
## $ X3PAr           <dbl> 0.593, 0.004, 0.193, 0.346, 0.387, 0.489, 0.667, 0....
## $ FTr             <dbl> 0.370, 0.337, 0.140, 0.301, 0.146, 0.141, 0.000, 0....
## $ ORB.            <dbl> 6.5, 11.0, 7.0, 1.4, 4.9, 1.3, 15.9, 0.0, 5.0, 13.6...
## $ DRB.            <dbl> 16.8, 25.0, 23.8, 14.4, 18.3, 11.3, 15.4, 5.0, 14.0...
## $ TRB.            <dbl> 11.7, 18.5, 15.0, 7.7, 11.7, 6.1, 15.7, 2.5, 9.5, 1...
## $ AST.            <dbl> 1.5, 15.4, 14.9, 18.6, 7.3, 13.3, 0.0, 23.2, 9.7, 1...
## $ STL.            <dbl> 1.1, 1.9, 1.4, 1.8, 0.8, 1.4, 7.2, 2.6, 0.9, 1.8, 1...
## $ BLK.            <dbl> 6.8, 1.3, 0.6, 0.5, 2.5, 0.3, 0.0, 2.4, 1.4, 2.8, 4...
## $ TOV.            <dbl> 18.2, 19.3, 12.5, 9.7, 15.6, 9.1, 0.0, 19.3, 12.0, ...
## $ USG.            <dbl> 19.5, 17.2, 27.6, 29.5, 15.5, 17.0, 19.2, 21.7, 14....
## $ OWS             <dbl> -0.4, 1.7, 0.3, -0.1, -0.4, 1.6, -0.1, -0.5, 2.0, 0...
## $ DWS             <dbl> 0.1, 1.4, 1.1, 0.5, 1.2, 1.6, 0.0, 0.1, 1.0, 0.6, 0...
## $ WS              <dbl> -0.2, 3.1, 1.4, 0.4, 0.8, 3.1, 0.0, -0.4, 3.1, 1.4,...
## $ WS.48           <dbl> -0.121, 0.160, 0.046, 0.027, 0.038, 0.067, -0.251, ...
## $ OBPM            <dbl> -10.6, -0.6, -0.6, -0.7, -3.7, -0.4, -12.6, -8.7, -...
## $ DBPM            <dbl> 0.5, 1.3, -1.3, -2.0, 0.9, -0.5, -0.7, -1.9, -0.6, ...
## $ BPM             <dbl> -10.1, 0.8, -1.9, -2.6, -2.9, -0.9, -13.3, -10.6, -...
## $ VORP            <dbl> -0.2, 0.7, 0.0, -0.1, -0.2, 0.6, 0.0, -0.3, 0.5, 0....

El dataset consta de 458 observaciones, con 28 variables de distinto formato. Tres de las variables son categóricas, algo a tener en cuenta si se quieren utilizar para las predicciones, y el resto de variables son numéricas. Antes de continuar, se evalúa la presencia de valores no disponibles, algo que puede entorpecer el resto de procesos. También se comprueba la ausencia de valores duplicados, pese a que el enunciado indica que ya se han elimiando, solo para comrpobar que no ha habido problemas en la carga de los datos.

sum(duplicated(nba)) # no hay valores duplicados 
## [1] 0
# Comprobacion de NA's
sum(is.na(nba)) # 8 na en todo el dataset.
## [1] 8
nba[rowSums(is.na(nba)) > 0, ] 
##                 Player  Salary NBA_Country NBA_DraftNumber Age  Tm G MP PER TS.
## 30         Tyler Lydon 1579440         USA              24  21 DEN 1  2   0  NA
## 38 Trey McKinney-Jones   46080         USA              62  27 IND 1  1   0  NA
##    X3PAr FTr ORB. DRB. TRB. AST. STL. BLK. TOV. USG. OWS DWS WS  WS.48 OBPM
## 30    NA  NA    0    0    0    0    0    0   NA    0   0   0  0 -0.016 -5.6
## 38    NA  NA    0    0    0    0    0    0   NA    0   0   0  0 -0.001 -5.7
##    DBPM  BPM VORP
## 30 -0.9 -6.5    0
## 38 -0.1 -5.9    0
# aplicando la fila de sumas al resultado de is.na(nba) y filtrando por mayor a 0, se obtienen las filas que tienen NA. 
# Son la 30 y la 38, Tyler Lydon y Trey McKinney-Jones, los elimino
nba <- nba[-c(30, 38),]

Se encuentran un total de 8 valores no disponibles, correspondientes a las observaciones de Tyler Lydon y Trey McKinney-Jones. Dada la cantidad de datos disponibles, se opta por la eliminación de estas dos observaciones, puesto que el efecto de su ausencia no tiene repercusión notable.

3.1 Correlaciones

Se examinan las correlaciones de las variables cuantitativas, con el fin de tener una primera idea de qué puede influir en el salario de los jugadores. No obstante, es necesario recordar que correlación no implica causalidad.

nbaNumericas <- nba %>% 
  select(-c(1, 3, 6))  # creo un nuevo dataframe que cotniene solo
# las variables numéricas

rh <- rcorr(as.matrix(nbaNumericas), # solo las cuantitativas
            type = "pearson")


# Correlograma 
ggcorrplot(rh$r, method = 'square', type = 'lower') +
  # Títulos y aspectos visuales
  ggtitle("Correlograma") +
  theme_bw() +
  theme_minimal() +
  xlab(NULL) + ylab(NULL) +
  theme(axis.text.x = element_text(angle =  90)) # rotacion del  

  # texto del eje x para facilitar su lectura

No hay variables que estén fuertemente correlacionadas con el salario. No obstante, para el primer modelo se incluirán aquellas que tienen más de un 0.25 de correlación, positiva o negativa. Estas variables son el número del draft, Win Share (WS), el valor de reemplazo (VORP), los minutos jugados (MP) y la edad del jugador (Age). Se excluye la salida de la matriz, porque es una matriz de dimensiones 25 x 25. No obstante, se puede acceder a los datos con rh$r.

Se puede apreciar que existen distintas variables que presentan alta correlacion entre ellas. Este fenómeno se da en aquellas que están relacionadas, como por ejemplo el porcentaje de rebotes ofensivos, defensivos y totales. A continuación se muestra un correlograma que incluye exclusivamente estas variables.

correlacionesFuertes <- nbaNumericas %>% 
  select(ORB., DRB., TRB., DWS, OWS, WS, 
         PER, WS.48, OBPM, BPM, VORP) # selecciono las variables del 
# dataset

# Calculo las correlaciones
rhFuertes <- rcorr(as.matrix(correlacionesFuertes, 
                             type = "pearson"))
    
# Correlograma
ggcorrplot(rhFuertes$r, 
           method = 'square', 
           type = 'lower', 
           lab = TRUE) + # añade los valores numéricos
  # Titulos y aspectos visuales 
  ggtitle("Correlaciones fuertes") +
  theme_bw() +
  theme_minimal() +
  xlab(NULL) + ylab(NULL) +
  theme(axis.text.x = element_text(angle =  90)) # rotación del  

  # texto del eje x para facilitar su lectura

3.2 Gráficos de dispersión

A continuación se representan gráficamente todas las variables numéricas en forma de gráfico de dispersión, manteniendo el salario siempre en el eje Y. La ejecución se lleva a cabo con un bucle, para acortar el código

# Grafico de todas las correlaciones, una a una con el salario 
for (var in names(nbaNumericas)) {
  # para cada variable del dataset...
  
  # se crea el objeto "plot" con el gráfico de dispersión 
  # correspondiente
  plot <- ggplot(nbaNumericas, 
                 aes(x = nbaNumericas[, var], # el eje varía
                     y = Salary)) + # el eje y es fijo
    geom_point(color = "aquamarine3") +
    
    # Tema y etiquetas
    labs(x = var,
         y = "Salario anual") +
    theme_minimal() 
    
  print(plot) # importante, sin el el loop no genera output. 
}

De todas las visualizaciones anteriores, se puede concluir que en todos los casos existe una gran dispersión. En principio, no parece haber grupos diferenciados en cada variable, y para mismos niveles de cada variable, el salario varía mucho. No obstante, la variable que mayor relación parece presentar con el salario es el número del draft. Se aprecia una tendencia negativa, a medida que el número del draft aumenta, el salario anual se reduce. No obstante, para esta variable también existe mucha dispersión en términos de salario para cada variable.

3.3 Funciones de densidad

De manera similar a las visualizaciones de los gráficos de dispersión, se trabaja con un bucle y se representan las funciones de densidad de todas las variables.

for (var in names(nbaNumericas)) {
  plot <- ggplot(nbaNumericas, aes(x = nbaNumericas[, var])) +
    # Gráfico de densidad
    geom_density(fill = "aquamarine3", alpha = 0.5 ) +
    
    # Tema, título y etiquetas
    labs(title = var,
         x = var) +
    theme_minimal()
  
  print(plot)
}

# Muchas de ellas estan concetnradas en torno a una media, no hay 
# mucha dispersion.

La mayoría de variables presenta una distribución estrecha, con poca varianza. Sin embargo, variables como el número del draft o los minutos jugados parecen agruparse en torno a dos puntos diferenciados. Puede ser interesante estudiar estas características y decidir si es conveniente hacer agrupaciones para variables, especialmente para el grupo de draft.

3.4 Variables cuantitativas

Se excluye del análisis a la variable de nombre del jugador, porque es coherente pensar que no es útil a la hora de determinar el salario.

3.4.1 Equipo

El siguiente gráfico muestra el salario medio por equipos

ggplot(nba, 
       aes(x = Tm, y = mean(Salary)), 
       ) +
  geom_col(fill = "aquamarine3") + # media en verde
  geom_col(aes(y = median(Salary)), # mediana en azul
           fill = "lightblue") +
  coord_flip() +
  theme_minimal() + 
  labs(title = "Salario medio y mediano por equipos",
       x = "Equipo",
       y = "Salario medio y mediano")

Tal como se puede observar, el salario medio por equipos es bastante similar. El único valor que destaca claramente es el de “TOT”, que hace referencia a jugadores que en la misma temporada han cambiado de equipo. En color azul se representa la mediana, puesto que es robusta a valores extremos. El valor es igualmente similar por equipos.

nba %>% filter(Tm == "TOT") %>% arrange(desc(Salary))
##                Player   Salary      NBA_Country NBA_DraftNumber Age  Tm  G   MP
## 1       Blake Griffin 29512900              USA               1  28 TOT 58 1970
## 2         George Hill 20000000              USA              26  31 TOT 65 1783
## 3         Greg Monroe 17884176              USA               7  27 TOT 47  951
## 4       Tobias Harris 16000000              USA              19  25 TOT 76 2546
## 5         Dwyane Wade 15550000              USA               5  36 TOT 64 1476
## 6        Eric Bledsoe 14500000              USA              18  28 TOT 70 2209
## 7      Nikola Mirotic 12500000       Montenegro              23  26 TOT 51 1352
## 8     Jordan Clarkson 11562500              USA              46  25 TOT 77 1819
## 9         Joe Johnson  9505000              USA              10  36 TOT 51 1129
## 10      Trevor Booker  9125000              USA              23  30 TOT 64 1085
## 11      Avery Bradley  8808989              USA              19  27 TOT 46 1433
## 12       Corey Brewer  7579366              USA               7  31 TOT 69 1121
## 13      Channing Frye  7420912              USA               8  34 TOT 50  643
## 14   Boban Marjanovic  7000000           Serbia              62  29 TOT 35  286
## 15        Jae Crowder  6796117              USA              34  27 TOT 76 2007
## 16    Marco Belinelli  6306060            Italy              18  31 TOT 76 1838
## 17      Isaiah Thomas  6261395              USA              60  28 TOT 32  862
## 18     Ersan Ilyasova  6000000           Turkey              36  30 TOT 65 1627
## 19     Brandan Wright  5179760              USA               8  30 TOT 28  381
## 20      Jahlil Okafor  4995120              USA               3  22 TOT 28  353
## 21      Jameer Nelson  4736050              USA              20  35 TOT 50 1013
## 22       Devin Harris  4402546              USA               5  34 TOT 67 1272
## 23       Nik Stauskas  3807146           Canada               8  24 TOT 37  459
## 24        Noah Vonleh  3505233              USA               9  22 TOT 54  875
## 25    Emmanuel Mudiay  3381480 Democratic Re...               7  21 TOT 63 1237
## 26      Elfrid Payton  3332340              USA              10  23 TOT 63 1808
## 27     Doug McDermott  3294994              USA              11  26 TOT 79 1724
## 28        James Ennis  3028410              USA              50  27 TOT 68 1540
## 29      Bruno Caboclo  2451225           Brazil              20  22 TOT 11   99
## 30        Rodney Hood  2386864              USA              23  25 TOT 58 1576
## 31     Ramon Sessions  2328652              USA              56  31 TOT 27  391
## 32   Dante Cunningham  2300000              USA              33  30 TOT 70 1499
## 33       Derrick Rose  2116955              USA               1  29 TOT 21  366
## 34       Luke Babbitt  1974159              USA              16  28 TOT 49  708
## 35      Rashad Vaughn  1889040              USA              17  21 TOT 28  212
## 36       Tyler Zeller  1709538              USA              17  28 TOT 62 1025
## 37        Willie Reed  1577230              USA              62  27 TOT 42  428
## 38   Shabazz Muhammad  1577230              USA              14  25 TOT 41  385
## 39    DeAndre Liggins  1577230              USA              53  29 TOT 55  711
## 40    Sean Kilpatrick  1524305              USA              62  28 TOT 48  537
## 41 Malachi Richardson  1504560              USA              22  22 TOT 26  324
## 42      Troy Williams  1471382              USA              62  23 TOT 21  307
## 43        Larry Nance  1471382              USA              27  25 TOT 62 1367
## 44  Willy Hernangomez  1435750            Spain              35  23 TOT 45  430
## 45      Brice Johnson  1331160              USA              25  23 TOT 18   98
## 46         Kay Felder  1312611              USA              54  22 TOT 15  137
## 47      Derrick Jones  1312611              USA              62  20 TOT 19  245
## 48      Isaiah Canaan  1069308              USA              34  26 TOT 20  422
## 49         Larry Drew   148318              USA              62  27 TOT 10   70
## 50        Nigel Hayes    92160              USA              62  23 TOT  6   60
## 51 Antonius Cleveland    92160              USA              62  23 TOT 14   93
## 52         Mike James    87552              USA              62  27 TOT 36  687
## 53       Jarell Eddie    83129              USA              62  26 TOT  3    9
## 54      Briante Weber    83129              USA              62  25 TOT 18  237
## 55        Gary Payton    50000              USA              62  25 TOT 19  149
##     PER   TS. X3PAr   FTr ORB. DRB. TRB. AST. STL. BLK. TOV. USG.  OWS DWS   WS
## 1  19.6 0.544 0.323 0.331  4.1 19.8 11.9 28.1  1.0  0.8 12.6 28.9  3.2 1.9  5.0
## 2  13.2 0.581 0.399 0.273  2.6  8.9  5.7 14.9  1.6  1.3 13.2 16.4  2.3 0.8  3.1
## 3  20.2 0.586 0.000 0.303 11.8 25.2 18.4 16.8  2.0  1.7 17.9 22.4  1.3 1.4  2.7
## 4  17.4 0.569 0.369 0.178  2.4 15.6  8.9 11.6  1.3  1.1  7.2 23.2  4.3 2.5  6.7
## 5  15.5 0.506 0.163 0.281  3.8 14.7  9.3 23.7  1.9  2.6 15.5 26.1 -0.2 1.5  1.4
## 6  19.3 0.577 0.364 0.318  2.6 11.5  7.1 24.9  3.2  1.5 16.1 26.3  2.6 2.3  4.9
## 7  17.8 0.567 0.525 0.210  4.1 24.0 14.1  8.7  1.4  2.2  8.0 23.2  1.6 1.5  3.2
## 8  16.7 0.543 0.337 0.202  3.3  9.2  6.3 19.4  1.5  0.3 10.8 26.6  1.9 1.1  3.1
## 9   8.4 0.494 0.404 0.124  1.4 14.7  8.1 10.2  0.8  0.5 11.6 16.0 -0.2 1.2  0.9
## 10 14.8 0.563 0.089 0.275 10.8 18.7 14.8 11.0  1.2  1.5 14.1 16.5  1.5 1.2  2.7
## 11  9.7 0.496 0.325 0.131  1.7  7.3  4.5 10.4  1.8  0.5 13.3 23.5 -1.4 1.3 -0.1
## 12 11.1 0.535 0.331 0.297  3.7 10.3  7.0  7.7  3.2  1.1 12.8 14.3  0.6 1.5  2.1
## 13 14.2 0.626 0.544 0.078  1.9 19.8 11.0  7.5  1.3  1.8  7.8 14.9  1.0 0.5  1.6
## 14 25.1 0.611 0.000 0.621 13.9 29.8 21.7 12.5  1.5  3.3 16.0 28.8  0.8 0.5  1.2
## 15 10.3 0.531 0.506 0.226  3.1 11.4  7.3  6.9  1.5  0.8  9.5 16.9  1.0 1.5  2.5
## 16 14.0 0.581 0.508 0.216  1.1  7.1  4.1 11.9  1.6  0.4 10.1 20.3  2.2 1.2  3.4
## 17 12.6 0.508 0.447 0.311  2.2  6.3  4.2 27.0  0.8  0.3 16.6 28.8 -0.1 0.3  0.2
## 18 14.5 0.555 0.414 0.216  7.6 17.5 12.6  7.6  1.7  1.2  9.7 18.4  1.9 1.7  3.6
## 19 19.0 0.596 0.000 0.324  9.8 19.3 14.4  5.6  1.7  6.4  6.4 14.7  0.8 0.5  1.3
## 20 15.4 0.584 0.029 0.210  6.3 19.4 12.8  5.9  0.4  3.9 12.2 21.0  0.3 0.3  0.6
## 21  8.2 0.489 0.508 0.082  1.4  9.5  5.6 23.0  1.3  0.3 21.0 13.7 -0.1 0.6  0.6
## 22 12.8 0.561 0.493 0.384  1.0  9.8  5.3 16.7  1.8  0.8 13.0 20.1  1.4 0.9  2.3
## 23  9.1 0.554 0.669 0.165  0.7 12.6  6.6 10.1  0.8  0.5 13.4 15.5  0.1 0.2  0.3
## 24 12.8 0.509 0.282 0.248  8.6 30.1 19.2  5.7  1.1  1.6 10.7 14.5  0.5 1.2  1.7
## 25 11.6 0.476 0.281 0.246  2.4 11.3  6.8 24.6  1.6  0.8 16.2 24.4 -0.7 0.7  0.0
## 26 16.6 0.538 0.138 0.252  3.8 12.8  8.3 34.9  2.2  1.0 18.5 21.8  1.4 1.4  2.9
## 27 10.5 0.579 0.420 0.164  2.6 10.2  6.3  6.6  0.5  0.8  9.4 15.0  1.7 0.6  2.3
## 28 11.8 0.592 0.391 0.314  5.3 11.1  8.1  6.7  1.5  1.1 11.6 13.6  2.0 1.1  3.1
## 29  8.5 0.398 0.567 0.200  7.7 15.6 11.5  6.9  1.5  3.8 10.9 16.6 -0.1 0.1  0.0
## 30 14.4 0.545 0.447 0.162  1.6  9.8  5.8  9.7  1.4  0.6  8.1 24.6  1.1 1.4  2.5
## 31 10.8 0.473 0.224 0.483  1.7  9.1  5.5 26.5  1.8  0.4 17.6 19.2  0.0 0.3  0.3
## 32  9.7 0.542 0.474 0.149  5.1 14.5  9.9  4.1  1.2  1.4  8.1 11.5  1.0 1.2  2.2
## 33 12.3 0.515 0.164 0.267  4.0  6.0  5.1 14.6  0.7  0.9 14.8 26.2 -0.1 0.0 -0.1
## 34 10.2 0.587 0.720 0.104  1.1 14.1  7.6  6.6  0.6  0.8  7.9 14.9  0.6 0.4  1.0
## 35  9.3 0.546 0.661 0.107  1.6  9.9  5.8  8.7  1.2  1.2  9.3 13.8  0.1 0.1  0.2
## 36 15.9 0.585 0.088 0.241 11.0 19.6 15.2  6.8  0.7  2.5 11.3 17.0  1.7 0.8  2.5
## 37 19.2 0.671 0.017 0.455  9.1 21.7 15.5  3.6  1.0  4.3 11.6 16.6  1.0 0.5  1.6
## 38 14.4 0.500 0.147 0.229  6.0 14.0 10.0  6.4  1.2  0.7  3.1 22.3  0.3 0.2  0.5
## 39  6.2 0.485 0.520 0.049  1.2 10.8  6.1  8.1  2.6  1.7 16.1  7.8 -0.1 0.7  0.6
## 40  9.5 0.475 0.500 0.238  0.6 14.9  7.7 11.5  0.8  0.6 10.3 24.6 -0.5 0.3 -0.2
## 41  5.9 0.446 0.444 0.244  1.7 10.7  6.0  5.6  1.6  0.3  9.1 15.2 -0.2 0.1 -0.1
## 42 15.2 0.544 0.349 0.275  8.0 14.8 11.4  7.8  3.2  1.1 13.5 20.1  0.2 0.4  0.5
## 43 20.3 0.613 0.031 0.338 12.3 21.6 17.0  8.8  3.0  2.1 10.0 15.8  3.5 2.2  5.7
## 44 20.6 0.592 0.075 0.555 13.6 25.2 19.3 11.0  1.8  2.8 15.4 21.7  0.8 0.6  1.4
## 45 18.2 0.486 0.024 0.119 10.4 25.4 17.9  3.4  4.5  5.5 10.2 22.3  0.0 0.2  0.2
## 46  2.9 0.375 0.279 0.176  1.5 10.5  5.9 22.5  1.1  0.6 17.9 28.4 -0.6 0.1 -0.5
## 47 10.3 0.488 0.346 0.462  9.6  7.8  8.7  5.1  0.8  4.4 10.1 12.7  0.2 0.3  0.4
## 48 13.5 0.539 0.482 0.372  1.5 10.1  5.7 26.7  1.8  0.2 15.4 18.9  0.5 0.1  0.6
## 49  3.0 0.354 0.375 0.000  4.8  0.0  2.3 18.7  0.0  0.0 11.1 16.7 -0.1 0.0 -0.1
## 50  2.4 0.362 0.611 0.167  1.8  8.0  4.7 11.0  0.0  1.6  9.4 15.7 -0.2 0.0 -0.2
## 51  5.4 0.402 0.125 0.375  2.3 12.2  7.2  2.9  3.2  4.8 17.7 11.0 -0.2 0.1  0.0
## 52 13.9 0.469 0.305 0.262  2.0 12.2  7.0 29.5  2.0  0.8 12.0 25.1 -0.1 0.3  0.2
## 53 -1.9 0.000 1.000 0.000  0.0 12.0  6.1  0.0  5.6  0.0  0.0  9.8  0.0 0.0  0.0
## 54 10.1 0.527 0.256 0.233  3.8 13.1  8.4 13.1  3.8  1.9 24.0 11.7  0.0 0.4  0.4
## 55  7.6 0.414 0.319 0.064  6.1 11.7  8.9 12.4  1.0  1.7  5.8 15.3  0.0 0.1  0.1
##     WS.48  OBPM DBPM   BPM VORP
## 1   0.123   2.8  0.0   2.8  2.4
## 2   0.083   0.3 -1.0  -0.7  0.6
## 3   0.134  -0.5  1.9   1.3  0.8
## 4   0.127   1.7 -0.7   1.0  1.9
## 5   0.045  -2.1  0.5  -1.7  0.1
## 6   0.107   2.2 -0.4   1.8  2.1
## 7   0.113   0.9 -0.8   0.1  0.7
## 8   0.081   0.9 -2.6  -1.7  0.1
## 9   0.040  -3.3 -0.4  -3.7 -0.5
## 10  0.120  -1.1  0.6  -0.5  0.4
## 11 -0.005  -2.8 -1.3  -4.1 -0.8
## 12  0.089  -1.8  1.0  -0.8  0.3
## 13  0.118  -0.1 -0.9  -1.0  0.2
## 14  0.208  -0.5  0.6   0.1  0.2
## 15  0.060  -0.8 -1.0  -1.8  0.1
## 16  0.089   0.7 -2.2  -1.5  0.2
## 17  0.008  -0.9 -4.3  -5.2 -0.7
## 18  0.106   0.0 -0.2  -0.2  0.7
## 19  0.165  -1.3  2.3   1.0  0.3
## 20  0.083  -3.7 -0.7  -4.4 -0.2
## 21  0.027  -2.6 -1.5  -4.1 -0.5
## 22  0.087  -0.3 -1.6  -1.8  0.0
## 23  0.035  -2.0 -1.8  -3.9 -0.2
## 24  0.091  -3.4  0.3  -3.1 -0.2
## 25  0.000  -2.5 -2.2  -4.7 -0.8
## 26  0.076   0.1  0.0   0.1  1.0
## 27  0.064  -0.7 -1.7  -2.4 -0.2
## 28  0.096  -0.5 -0.4  -0.9  0.4
## 29 -0.012  -4.1 -0.2  -4.3 -0.1
## 30  0.077   0.2 -2.2  -2.1  0.0
## 31  0.031  -3.2 -2.0  -5.2 -0.3
## 32  0.071  -1.5 -0.1  -1.6  0.2
## 33 -0.010  -3.5 -4.0  -7.4 -0.5
## 34  0.067  -0.8 -2.1  -3.0 -0.2
## 35  0.050  -1.9 -2.9  -4.7 -0.1
## 36  0.119  -1.3 -0.5  -1.8  0.0
## 37  0.175  -0.8  0.0  -0.8  0.1
## 38  0.064  -2.0 -3.8  -5.8 -0.4
## 39  0.037  -3.2  1.2  -2.0  0.0
## 40 -0.020  -3.7 -3.8  -7.5 -0.7
## 41 -0.018  -4.3 -2.2  -6.5 -0.4
## 42  0.085  -0.1  0.1   0.0  0.2
## 43  0.200   1.2  2.4   3.6  1.9
## 44  0.156  -0.1  0.6   0.5  0.3
## 45  0.085  -4.9  2.2  -2.7  0.0
## 46 -0.185  -8.7 -3.5 -12.1 -0.3
## 47  0.081  -2.5  0.8  -1.7  0.0
## 48  0.072   0.1 -2.5  -2.4  0.0
## 49 -0.063  -5.4 -5.4 -10.7 -0.2
## 50 -0.134  -6.0 -4.1 -10.0 -0.1
## 51 -0.001  -7.5  3.8  -3.7  0.0
## 52  0.016  -0.8 -1.8  -2.7 -0.1
## 53 -0.141 -10.1  1.7  -8.4  0.0
## 54  0.072  -3.3  2.9  -0.4  0.1
## 55  0.021  -3.4 -1.7  -5.2 -0.1

Seria interesante construir una nueva variable, que contraste si el jugador ha jugado en varios equipos o no.

3.4.2 Nacionalidad

Visualizacion de los jugadores por su nacionalidad

ggplot(nba, 
       aes(x = NBA_Country), 
       ) +
  geom_bar(fill = "aquamarine3", 
       color = "black") +
  coord_flip() +
  theme_minimal() + 
  labs(title = "Nacionalidad de los jugadores",
       y = "Nº de jugadores",
       x = "Nacionalidad")

La inmnesa mayoria de los jugadores son de nacionalidad estadounidense. A continuacion una visualicación que excluye a USA, para ver bien los jugadores en el resto

nba %>% 
  filter(NBA_Country != "USA") %>% # el filtro para paises                                               # distintos a usa
  ggplot(aes(x = NBA_Country)) +
  geom_bar(fill = "aquamarine3", color = "black") +
  coord_flip() +
  theme_minimal() + 
  labs(title = "Nacionalidad de los jugadores (excluida USA)",
       y = "Nº de jugadores",
       x = "Nacionalidad")

4 Ingeniería de variables inicial

En base a las variables categóricas examinadas, en este apartado se plantean una serie de transformaciones y creaciones de variables, para extender el análisis de datos, y para incluirlas en el modelo si pudiese resultar interesante.

4.0.1 Equipo

El gráfico de salario medio y mediano para cada equipo revela que la categoría “TOT”, la cual recoge a los jugadores que han jugadoen varios equipos en la misma temporada, tiene valores muy superiores al resto. Puesto que quizá sea interesante introducir una variable que recoja esta diferencia en el modelo, se procede a su creación, mediante “string encoding”

nba <- nba %>% mutate(
  variosEquipos = case_when(Tm == "TOT" ~ "Varios equipos",
                            Tm != "TOT" ~ "Un solo equipo"
  )
)
# Se crea la variable "variosEquipos" que tomará el valor 
# "Varios equipos" si el jugador ha jugado en varios equipos, 
# y "Un solo equipo en caso contrario"



# Paso a factor
nba$variosEquipos <- as.factor(nba$variosEquipos)

Una vez creada la variable, se procede a examinar el comportamiento del salario para cada grupo

ggplotly( # ggplotly transforma el gráfico en interactivo
ggplot(nba, aes(x = variosEquipos, 
                y = Salary, 
                fill = variosEquipos))+
  geom_boxplot() +
  labs(title = "Un equipo vs. varios",
       x = NULL, 
       y = "Salario",
       fill = NULL) + # titulo de la leyenda
  theme_minimal() +
  theme(axis.text.x = element_blank()) # quita las x ticks
)

Pese a lo constatado al analizar la categoría de varios equipos contra los equipos de manera individual, el grafico de caja y bigotes muestra que, al comparar ambos grupos, no existen grandes diferencias. El salario mediano es practicamente el mismo, aunque la distribucón es algo más pequeña en el grupo de varios equipos. Hay que tener en cuenta que este grupo tiene muchos menos individuos que el grupo de un solo equipo.

t.test(nba$Salary ~ nba$variosEquipos)
## 
##  Welch Two Sample t-test
## 
## data:  nba$Salary by nba$variosEquipos
## t = 1.8567, df = 78.544, p-value = 0.06711
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -117562.9 3375908.7
## sample estimates:
## mean in group Un solo equipo mean in group Varios equipos 
##                      6846139                      5216966

El t-test, que establece como hipótesis nula la igualdad de media entre grupos, devuelve un p.valor que no permite rechazar la igualdad, aunque por poco. El salario medio de los dos grupos es estadísticamente igual.

No obstante, a continuación se crea una nueva variable “dummy” utilizando la técnica de “one hot encoding” con el fin de poder incluir esta variable en los modelos, para ver su efecto.

nba <- nba %>% 
  mutate(variosEquiposDummy = ifelse(Tm == "TOT", 1, 0))
# Toma el valor 1 si el jugador ha judado en mas de un equipo

4.0.2 Nacionalidad

Igual que para el caso del equipo, se crea una nueva variable que codifique si el jugador es estadounidense o no. El procedimiento es el mismo.

# Creacion de la nueva columna
nba <- nba %>% mutate(nacionalidad = 
                    case_when(NBA_Country == "USA" ~ "USA",
                              NBA_Country != "USA"~ "NotUSA"))


# Conversión a factor
nba$nacionalidad <- as.factor(nba$nacionalidad)

 

ggplotly( # ggplotly transforma el gráfico en interactivo
ggplot(nba, aes(x = nacionalidad, 
                y = Salary, 
                fill = nacionalidad))+
  geom_boxplot() +
  labs(title = "Salarios de estadounidenses vs. no estadounidenses",
       x = NULL, 
       y = "Salario",
       fill = NULL) + # titulo de la leyenda
  theme_minimal() +
  theme(axis.text.x = element_blank()) # quita las x ticks
)

Igual que para el caso de los equipos, las distribuciones son casi iguales

t.test(nba$Salary ~ nba$nacionalidad)
## 
##  Welch Two Sample t-test
## 
## data:  nba$Salary by nba$nacionalidad
## t = 0.66206, df = 197.85, p-value = 0.5087
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -991257.5 1993217.6
## sample estimates:
## mean in group NotUSA    mean in group USA 
##              7046470              6545490

No se rechaza la igualdad de medias. Igualmente, se genera la variable “dummy” de cara a incluirla en los modelos.

nba <- nba %>% 
  mutate(nacionalidadDummy = ifelse(nacionalidad == "USA", 1, 0))
# Toma el valor 1 si el jugador es de USA

4.1 Modelos iniciales

Inicialmente, se construyen los siguientes modelos:

Un modelo con las variables que resultaron más correlacionadas con el salario

modeloMasCorrelacionadas <- lm(
  formula = Salary ~ NBA_DraftNumber + WS + VORP + MP + Age, 
              data = nba)

Un segundo modelo, que es el anterior pero con el numero del draft al cuadrado

modeloDraftCuadrado <- lm(
  formula = Salary ~ I(NBA_DraftNumber^2) + WS + VORP + MP + Age, 
              data = nba)

Un terce modelo, que incluye interacciones entre el draft y la edad

modeloDraftEdad <- lm(
  formula = Salary ~ NBA_DraftNumber:Age + WS + VORP + MP, 
              data = nba)

Finalmente, un cuarto modelo, que incluye las variables dummy creadas

modeloDummy <- lm(
  formula = Salary ~ NBA_DraftNumber + Age + WS + VORP + MP +
    nacionalidadDummy + variosEquiposDummy, 
              data = nba)

Antes de pasar a la selección de variables con el método stepwise, se comparan los modelos anteriores mediante el criterio de información de Akaike.

AIC(modeloMasCorrelacionadas, 
    modeloDraftCuadrado, 
    modeloDraftEdad, 
    modeloDummy)
##                          df      AIC
## modeloMasCorrelacionadas  7 16340.62
## modeloDraftCuadrado       7 16348.53
## modeloDraftEdad           6 16425.26
## modeloDummy               9 16344.43

Utilizando el AIC, el mejor modelo es el primero. No obstante, antes de evaluarlo, se utiliza el método stepwise para ver cuales son las variables que minimizan el AIC del modelo

library(MASS) # no he cargado antes MASS porque la funcion 
# select interfiere con la de dplyr, y asi no tengo que  usar
# dplyr::select tantas veces 

# Utilizo backward porque en el script utilicé backward, forward y 
# mixto, y el de menor AIC fue el de backward.

nbaNumericas <- nba[, -c(1 , 3, 6, 29, 31)] 
# Primero actualizo el dataset
# de variables numericas, de manera que contenga las nuevas dummy.
# El 29 y el 31 hacen referencia a las nuevas variables creadas 
# con string encoding, tambien hay que excluirlas

modeloTotal <- lm(Salary ~., data = nbaNumericas) # defino un modelo  # con todo
stepAIC(modeloTotal, direction = "backward") # ejecuto el stepwise
## Start:  AIC=14948.01
## Salary ~ NBA_DraftNumber + Age + G + MP + PER + TS. + X3PAr + 
##     FTr + ORB. + DRB. + TRB. + AST. + STL. + BLK. + TOV. + USG. + 
##     OWS + DWS + WS + WS.48 + OBPM + DBPM + BPM + VORP + variosEquiposDummy + 
##     nacionalidadDummy
## 
##                      Df  Sum of Sq        RSS   AIC
## - TOV.                1 1.0877e+09 1.1914e+16 14946
## - WS.48               1 8.9241e+10 1.1914e+16 14946
## - FTr                 1 3.1320e+11 1.1914e+16 14946
## - variosEquiposDummy  1 5.3321e+11 1.1914e+16 14946
## - OWS                 1 1.7869e+12 1.1916e+16 14946
## - BPM                 1 1.9095e+12 1.1916e+16 14946
## - BLK.                1 2.3257e+12 1.1916e+16 14946
## - DBPM                1 2.4219e+12 1.1916e+16 14946
## - DWS                 1 3.3984e+12 1.1917e+16 14946
## - WS                  1 3.7950e+12 1.1918e+16 14946
## - OBPM                1 3.9502e+12 1.1918e+16 14946
## - TS.                 1 5.0209e+12 1.1919e+16 14946
## - AST.                1 5.3873e+12 1.1919e+16 14946
## - STL.                1 6.1502e+12 1.1920e+16 14946
## - nacionalidadDummy   1 1.3022e+13 1.1927e+16 14946
## - DRB.                1 2.4096e+13 1.1938e+16 14947
## - VORP                1 2.6991e+13 1.1941e+16 14947
## - TRB.                1 3.2593e+13 1.1946e+16 14947
## - PER                 1 3.4665e+13 1.1949e+16 14947
## - ORB.                1 3.5574e+13 1.1949e+16 14948
## <none>                             1.1914e+16 14948
## - X3PAr               1 5.4731e+13 1.1969e+16 14948
## - USG.                1 6.1221e+13 1.1975e+16 14948
## - NBA_DraftNumber     1 5.9205e+14 1.2506e+16 14969
## - MP                  1 7.0844e+14 1.2622e+16 14974
## - G                   1 1.0000e+15 1.2914e+16 14985
## - Age                 1 2.1825e+15 1.4096e+16 15027
## 
## Step:  AIC=14946.01
## Salary ~ NBA_DraftNumber + Age + G + MP + PER + TS. + X3PAr + 
##     FTr + ORB. + DRB. + TRB. + AST. + STL. + BLK. + USG. + OWS + 
##     DWS + WS + WS.48 + OBPM + DBPM + BPM + VORP + variosEquiposDummy + 
##     nacionalidadDummy
## 
##                      Df  Sum of Sq        RSS   AIC
## - WS.48               1 8.8406e+10 1.1914e+16 14944
## - FTr                 1 3.1642e+11 1.1914e+16 14944
## - variosEquiposDummy  1 5.3214e+11 1.1914e+16 14944
## - OWS                 1 1.7864e+12 1.1916e+16 14944
## - BPM                 1 1.9389e+12 1.1916e+16 14944
## - DBPM                1 2.4487e+12 1.1916e+16 14944
## - BLK.                1 2.4684e+12 1.1916e+16 14944
## - DWS                 1 3.4025e+12 1.1917e+16 14944
## - WS                  1 3.7941e+12 1.1918e+16 14944
## - OBPM                1 4.0439e+12 1.1918e+16 14944
## - STL.                1 6.2918e+12 1.1920e+16 14944
## - AST.                1 6.4495e+12 1.1920e+16 14944
## - TS.                 1 6.5197e+12 1.1920e+16 14944
## - nacionalidadDummy   1 1.3151e+13 1.1927e+16 14944
## - DRB.                1 2.4112e+13 1.1938e+16 14945
## - VORP                1 2.7916e+13 1.1942e+16 14945
## - TRB.                1 3.2595e+13 1.1946e+16 14945
## - PER                 1 3.5070e+13 1.1949e+16 14945
## - ORB.                1 3.5580e+13 1.1949e+16 14946
## <none>                             1.1914e+16 14946
## - X3PAr               1 5.7716e+13 1.1972e+16 14946
## - USG.                1 6.1283e+13 1.1975e+16 14946
## - NBA_DraftNumber     1 5.9377e+14 1.2508e+16 14968
## - MP                  1 7.4077e+14 1.2655e+16 14973
## - G                   1 1.0141e+15 1.2928e+16 14984
## - Age                 1 2.2021e+15 1.4116e+16 15026
## 
## Step:  AIC=14944.02
## Salary ~ NBA_DraftNumber + Age + G + MP + PER + TS. + X3PAr + 
##     FTr + ORB. + DRB. + TRB. + AST. + STL. + BLK. + USG. + OWS + 
##     DWS + WS + OBPM + DBPM + BPM + VORP + variosEquiposDummy + 
##     nacionalidadDummy
## 
##                      Df  Sum of Sq        RSS   AIC
## - FTr                 1 2.6159e+11 1.1914e+16 14942
## - variosEquiposDummy  1 5.9846e+11 1.1915e+16 14942
## - OWS                 1 1.7998e+12 1.1916e+16 14942
## - BPM                 1 1.9294e+12 1.1916e+16 14942
## - BLK.                1 2.3820e+12 1.1916e+16 14942
## - DBPM                1 2.4359e+12 1.1916e+16 14942
## - DWS                 1 3.3517e+12 1.1917e+16 14942
## - WS                  1 3.8055e+12 1.1918e+16 14942
## - OBPM                1 4.0678e+12 1.1918e+16 14942
## - STL.                1 7.2532e+12 1.1921e+16 14942
## - TS.                 1 8.8586e+12 1.1923e+16 14942
## - AST.                1 1.0136e+13 1.1924e+16 14942
## - nacionalidadDummy   1 1.3695e+13 1.1928e+16 14943
## - DRB.                1 2.4691e+13 1.1939e+16 14943
## - VORP                1 2.7843e+13 1.1942e+16 14943
## - TRB.                1 3.3217e+13 1.1947e+16 14943
## - ORB.                1 3.6693e+13 1.1951e+16 14944
## <none>                             1.1914e+16 14944
## - PER                 1 5.6921e+13 1.1971e+16 14944
## - X3PAr               1 5.9516e+13 1.1973e+16 14944
## - USG.                1 1.1803e+14 1.2032e+16 14947
## - NBA_DraftNumber     1 5.9936e+14 1.2513e+16 14966
## - MP                  1 9.1792e+14 1.2832e+16 14978
## - G                   1 1.0235e+15 1.2937e+16 14982
## - Age                 1 2.2062e+15 1.4120e+16 15024
## 
## Step:  AIC=14942.03
## Salary ~ NBA_DraftNumber + Age + G + MP + PER + TS. + X3PAr + 
##     ORB. + DRB. + TRB. + AST. + STL. + BLK. + USG. + OWS + DWS + 
##     WS + OBPM + DBPM + BPM + VORP + variosEquiposDummy + nacionalidadDummy
## 
##                      Df  Sum of Sq        RSS   AIC
## - variosEquiposDummy  1 5.9924e+11 1.1915e+16 14940
## - OWS                 1 1.6987e+12 1.1916e+16 14940
## - BPM                 1 1.9485e+12 1.1916e+16 14940
## - BLK.                1 2.3417e+12 1.1917e+16 14940
## - DBPM                1 2.4647e+12 1.1917e+16 14940
## - DWS                 1 3.2238e+12 1.1917e+16 14940
## - WS                  1 3.6650e+12 1.1918e+16 14940
## - OBPM                1 4.0901e+12 1.1918e+16 14940
## - STL.                1 7.2536e+12 1.1921e+16 14940
## - TS.                 1 9.7660e+12 1.1924e+16 14940
## - AST.                1 1.0266e+13 1.1924e+16 14940
## - nacionalidadDummy   1 1.3953e+13 1.1928e+16 14941
## - DRB.                1 2.4688e+13 1.1939e+16 14941
## - VORP                1 2.7762e+13 1.1942e+16 14941
## - TRB.                1 3.3154e+13 1.1947e+16 14941
## - ORB.                1 3.6590e+13 1.1951e+16 14942
## <none>                             1.1914e+16 14942
## - PER                 1 5.6667e+13 1.1971e+16 14942
## - X3PAr               1 5.9872e+13 1.1974e+16 14942
## - USG.                1 1.1859e+14 1.2033e+16 14945
## - NBA_DraftNumber     1 6.1047e+14 1.2525e+16 14964
## - MP                  1 9.1778e+14 1.2832e+16 14976
## - G                   1 1.0336e+15 1.2948e+16 14980
## - Age                 1 2.2176e+15 1.4132e+16 15022
## 
## Step:  AIC=14940.05
## Salary ~ NBA_DraftNumber + Age + G + MP + PER + TS. + X3PAr + 
##     ORB. + DRB. + TRB. + AST. + STL. + BLK. + USG. + OWS + DWS + 
##     WS + OBPM + DBPM + BPM + VORP + nacionalidadDummy
## 
##                     Df  Sum of Sq        RSS   AIC
## - OWS                1 1.6830e+12 1.1917e+16 14938
## - BPM                1 1.9188e+12 1.1917e+16 14938
## - DBPM               1 2.4227e+12 1.1917e+16 14938
## - BLK.               1 2.4833e+12 1.1917e+16 14938
## - DWS                1 3.1729e+12 1.1918e+16 14938
## - WS                 1 3.6356e+12 1.1918e+16 14938
## - OBPM               1 4.0632e+12 1.1919e+16 14938
## - STL.               1 7.2065e+12 1.1922e+16 14938
## - TS.                1 9.6123e+12 1.1924e+16 14938
## - AST.               1 1.0225e+13 1.1925e+16 14938
## - nacionalidadDummy  1 1.4330e+13 1.1929e+16 14939
## - DRB.               1 2.4715e+13 1.1940e+16 14939
## - VORP               1 2.8071e+13 1.1943e+16 14939
## - TRB.               1 3.3223e+13 1.1948e+16 14939
## - ORB.               1 3.6666e+13 1.1951e+16 14940
## <none>                            1.1915e+16 14940
## - PER                1 5.7843e+13 1.1973e+16 14940
## - X3PAr              1 6.0657e+13 1.1975e+16 14940
## - USG.               1 1.1825e+14 1.2033e+16 14943
## - NBA_DraftNumber    1 6.0988e+14 1.2525e+16 14962
## - MP                 1 9.1984e+14 1.2835e+16 14974
## - G                  1 1.0382e+15 1.2953e+16 14978
## - Age                1 2.2230e+15 1.4138e+16 15021
## 
## Step:  AIC=14938.12
## Salary ~ NBA_DraftNumber + Age + G + MP + PER + TS. + X3PAr + 
##     ORB. + DRB. + TRB. + AST. + STL. + BLK. + USG. + DWS + WS + 
##     OBPM + DBPM + BPM + VORP + nacionalidadDummy
## 
##                     Df  Sum of Sq        RSS   AIC
## - BPM                1 2.0886e+12 1.1919e+16 14936
## - DBPM               1 2.6009e+12 1.1919e+16 14936
## - BLK.               1 2.6993e+12 1.1919e+16 14936
## - OBPM               1 4.3221e+12 1.1921e+16 14936
## - STL.               1 6.5973e+12 1.1923e+16 14936
## - TS.                1 9.3397e+12 1.1926e+16 14936
## - AST.               1 1.0865e+13 1.1927e+16 14937
## - DWS                1 1.3018e+13 1.1930e+16 14937
## - nacionalidadDummy  1 1.4691e+13 1.1931e+16 14937
## - DRB.               1 2.4710e+13 1.1941e+16 14937
## - VORP               1 2.8829e+13 1.1945e+16 14937
## - TRB.               1 3.3269e+13 1.1950e+16 14938
## - ORB.               1 3.6745e+13 1.1953e+16 14938
## <none>                            1.1917e+16 14938
## - PER                1 5.8763e+13 1.1975e+16 14938
## - X3PAr              1 6.0990e+13 1.1977e+16 14939
## - WS                 1 6.6754e+13 1.1983e+16 14939
## - USG.               1 1.1913e+14 1.2036e+16 14941
## - NBA_DraftNumber    1 6.1650e+14 1.2533e+16 14960
## - MP                 1 9.1824e+14 1.2835e+16 14972
## - G                  1 1.0366e+15 1.2953e+16 14976
## - Age                1 2.2215e+15 1.4138e+16 15019
## 
## Step:  AIC=14936.2
## Salary ~ NBA_DraftNumber + Age + G + MP + PER + TS. + X3PAr + 
##     ORB. + DRB. + TRB. + AST. + STL. + BLK. + USG. + DWS + WS + 
##     OBPM + DBPM + VORP + nacionalidadDummy
## 
##                     Df  Sum of Sq        RSS   AIC
## - BLK.               1 2.4776e+12 1.1921e+16 14934
## - STL.               1 6.8228e+12 1.1925e+16 14934
## - DBPM               1 6.8629e+12 1.1925e+16 14934
## - TS.                1 8.9655e+12 1.1928e+16 14935
## - AST.               1 1.0674e+13 1.1929e+16 14935
## - DWS                1 1.2710e+13 1.1931e+16 14935
## - nacionalidadDummy  1 1.4682e+13 1.1933e+16 14935
## - DRB.               1 2.5619e+13 1.1944e+16 14935
## - VORP               1 2.8891e+13 1.1947e+16 14935
## - TRB.               1 3.4249e+13 1.1953e+16 14936
## - ORB.               1 3.7740e+13 1.1956e+16 14936
## <none>                            1.1919e+16 14936
## - PER                1 5.7353e+13 1.1976e+16 14936
## - X3PAr              1 5.9432e+13 1.1978e+16 14937
## - OBPM               1 6.5340e+13 1.1984e+16 14937
## - WS                 1 6.6133e+13 1.1985e+16 14937
## - USG.               1 1.1956e+14 1.2038e+16 14939
## - NBA_DraftNumber    1 6.2179e+14 1.2540e+16 14959
## - MP                 1 9.1681e+14 1.2835e+16 14970
## - G                  1 1.0348e+15 1.2953e+16 14974
## - Age                1 2.2297e+15 1.4148e+16 15017
## 
## Step:  AIC=14934.3
## Salary ~ NBA_DraftNumber + Age + G + MP + PER + TS. + X3PAr + 
##     ORB. + DRB. + TRB. + AST. + STL. + USG. + DWS + WS + OBPM + 
##     DBPM + VORP + nacionalidadDummy
## 
##                     Df  Sum of Sq        RSS   AIC
## - TS.                1 7.8371e+12 1.1929e+16 14933
## - AST.               1 1.4225e+13 1.1935e+16 14933
## - nacionalidadDummy  1 1.4719e+13 1.1936e+16 14933
## - DWS                1 1.7119e+13 1.1938e+16 14933
## - STL.               1 1.8063e+13 1.1939e+16 14933
## - DBPM               1 2.6441e+13 1.1948e+16 14933
## - DRB.               1 2.7790e+13 1.1949e+16 14933
## - VORP               1 3.3346e+13 1.1954e+16 14934
## - TRB.               1 3.5638e+13 1.1957e+16 14934
## - ORB.               1 3.8618e+13 1.1960e+16 14934
## <none>                            1.1921e+16 14934
## - WS                 1 6.4336e+13 1.1985e+16 14935
## - X3PAr              1 6.4431e+13 1.1986e+16 14935
## - PER                1 8.0701e+13 1.2002e+16 14936
## - OBPM               1 9.1817e+13 1.2013e+16 14936
## - USG.               1 1.2226e+14 1.2043e+16 14937
## - NBA_DraftNumber    1 6.3424e+14 1.2555e+16 14957
## - MP                 1 9.2302e+14 1.2844e+16 14968
## - G                  1 1.0375e+15 1.2959e+16 14973
## - Age                1 2.2405e+15 1.4162e+16 15016
## 
## Step:  AIC=14932.62
## Salary ~ NBA_DraftNumber + Age + G + MP + PER + X3PAr + ORB. + 
##     DRB. + TRB. + AST. + STL. + USG. + DWS + WS + OBPM + DBPM + 
##     VORP + nacionalidadDummy
## 
##                     Df  Sum of Sq        RSS   AIC
## - AST.               1 1.1112e+13 1.1940e+16 14931
## - STL.               1 1.4165e+13 1.1943e+16 14931
## - nacionalidadDummy  1 1.4456e+13 1.1943e+16 14931
## - DWS                1 1.6694e+13 1.1946e+16 14931
## - DRB.               1 2.5107e+13 1.1954e+16 14932
## - DBPM               1 2.5567e+13 1.1954e+16 14932
## - TRB.               1 3.2706e+13 1.1962e+16 14932
## - VORP               1 3.4003e+13 1.1963e+16 14932
## - ORB.               1 3.5532e+13 1.1964e+16 14932
## <none>                            1.1929e+16 14933
## - X3PAr              1 5.7789e+13 1.1987e+16 14933
## - WS                 1 6.2952e+13 1.1992e+16 14933
## - PER                1 8.3195e+13 1.2012e+16 14934
## - OBPM               1 8.4199e+13 1.2013e+16 14934
## - USG.               1 1.2730e+14 1.2056e+16 14936
## - NBA_DraftNumber    1 6.4275e+14 1.2572e+16 14956
## - MP                 1 9.4035e+14 1.2869e+16 14967
## - G                  1 1.0692e+15 1.2998e+16 14972
## - Age                1 2.2326e+15 1.4162e+16 15014
## 
## Step:  AIC=14931.07
## Salary ~ NBA_DraftNumber + Age + G + MP + PER + X3PAr + ORB. + 
##     DRB. + TRB. + STL. + USG. + DWS + WS + OBPM + DBPM + VORP + 
##     nacionalidadDummy
## 
##                     Df  Sum of Sq        RSS   AIC
## - nacionalidadDummy  1 1.3729e+13 1.1954e+16 14930
## - STL.               1 1.4656e+13 1.1955e+16 14930
## - DWS                1 1.4716e+13 1.1955e+16 14930
## - DBPM               1 2.1751e+13 1.1962e+16 14930
## - DRB.               1 2.5650e+13 1.1966e+16 14930
## - VORP               1 2.6759e+13 1.1967e+16 14930
## - TRB.               1 3.3541e+13 1.1974e+16 14930
## - ORB.               1 3.5304e+13 1.1975e+16 14930
## - X3PAr              1 4.7634e+13 1.1988e+16 14931
## <none>                            1.1940e+16 14931
## - WS                 1 7.2427e+13 1.2012e+16 14932
## - PER                1 7.5762e+13 1.2016e+16 14932
## - OBPM               1 7.6140e+13 1.2016e+16 14932
## - USG.               1 1.1658e+14 1.2057e+16 14934
## - NBA_DraftNumber    1 6.4975e+14 1.2590e+16 14955
## - MP                 1 9.3591e+14 1.2876e+16 14966
## - G                  1 1.0780e+15 1.3018e+16 14971
## - Age                1 2.2236e+15 1.4164e+16 15012
## 
## Step:  AIC=14929.63
## Salary ~ NBA_DraftNumber + Age + G + MP + PER + X3PAr + ORB. + 
##     DRB. + TRB. + STL. + USG. + DWS + WS + OBPM + DBPM + VORP
## 
##                   Df  Sum of Sq        RSS   AIC
## - DWS              1 1.3674e+13 1.1967e+16 14928
## - STL.             1 1.6114e+13 1.1970e+16 14928
## - DBPM             1 2.1136e+13 1.1975e+16 14928
## - VORP             1 2.6050e+13 1.1980e+16 14929
## - DRB.             1 2.6228e+13 1.1980e+16 14929
## - TRB.             1 3.4480e+13 1.1988e+16 14929
## - ORB.             1 3.6227e+13 1.1990e+16 14929
## - X3PAr            1 4.8211e+13 1.2002e+16 14930
## <none>                          1.1954e+16 14930
## - WS               1 7.3809e+13 1.2028e+16 14931
## - PER              1 7.5833e+13 1.2030e+16 14931
## - OBPM             1 7.6710e+13 1.2030e+16 14931
## - USG.             1 1.1702e+14 1.2071e+16 14932
## - NBA_DraftNumber  1 6.4110e+14 1.2595e+16 14953
## - MP               1 9.2446e+14 1.2878e+16 14964
## - G                1 1.0656e+15 1.3019e+16 14969
## - Age              1 2.2142e+15 1.4168e+16 15010
## 
## Step:  AIC=14928.18
## Salary ~ NBA_DraftNumber + Age + G + MP + PER + X3PAr + ORB. + 
##     DRB. + TRB. + STL. + USG. + WS + OBPM + DBPM + VORP
## 
##                   Df  Sum of Sq        RSS   AIC
## - DBPM             1 1.3054e+13 1.1980e+16 14927
## - STL.             1 1.3666e+13 1.1981e+16 14927
## - DRB.             1 2.0975e+13 1.1988e+16 14927
## - VORP             1 2.1716e+13 1.1989e+16 14927
## - TRB.             1 2.8572e+13 1.1996e+16 14927
## - ORB.             1 3.0256e+13 1.1998e+16 14927
## <none>                          1.1967e+16 14928
## - X3PAr            1 6.1444e+13 1.2029e+16 14929
## - WS               1 6.6537e+13 1.2034e+16 14929
## - PER              1 9.3372e+13 1.2061e+16 14930
## - OBPM             1 9.6756e+13 1.2064e+16 14930
## - USG.             1 1.1213e+14 1.2080e+16 14931
## - NBA_DraftNumber  1 6.3970e+14 1.2607e+16 14951
## - MP               1 9.8628e+14 1.2954e+16 14964
## - G                1 1.0824e+15 1.3050e+16 14968
## - Age              1 2.2279e+15 1.4195e+16 15009
## 
## Step:  AIC=14926.7
## Salary ~ NBA_DraftNumber + Age + G + MP + PER + X3PAr + ORB. + 
##     DRB. + TRB. + STL. + USG. + WS + OBPM + VORP
## 
##                   Df  Sum of Sq        RSS   AIC
## - STL.             1 3.5855e+12 1.1984e+16 14925
## - DRB.             1 2.3335e+13 1.2004e+16 14926
## - TRB.             1 3.2795e+13 1.2013e+16 14926
## - ORB.             1 3.5036e+13 1.2016e+16 14926
## - VORP             1 4.1953e+13 1.2022e+16 14926
## <none>                          1.1980e+16 14927
## - WS               1 5.6198e+13 1.2037e+16 14927
## - X3PAr            1 7.7957e+13 1.2058e+16 14928
## - PER              1 8.9034e+13 1.2070e+16 14928
## - OBPM             1 9.2588e+13 1.2073e+16 14928
## - USG.             1 1.0474e+14 1.2085e+16 14929
## - NBA_DraftNumber  1 6.6016e+14 1.2641e+16 14951
## - MP               1 9.9212e+14 1.2973e+16 14963
## - G                1 1.1006e+15 1.3081e+16 14967
## - Age              1 2.2220e+15 1.4202e+16 15007
## 
## Step:  AIC=14924.85
## Salary ~ NBA_DraftNumber + Age + G + MP + PER + X3PAr + ORB. + 
##     DRB. + TRB. + USG. + WS + OBPM + VORP
## 
##                   Df  Sum of Sq        RSS   AIC
## - DRB.             1 2.3150e+13 1.2007e+16 14924
## - TRB.             1 3.2841e+13 1.2017e+16 14924
## - ORB.             1 3.4831e+13 1.2019e+16 14924
## - VORP             1 3.8380e+13 1.2022e+16 14924
## <none>                          1.1984e+16 14925
## - WS               1 6.4134e+13 1.2048e+16 14925
## - X3PAr            1 7.7528e+13 1.2062e+16 14926
## - PER              1 9.9444e+13 1.2084e+16 14927
## - OBPM             1 1.0195e+14 1.2086e+16 14927
## - USG.             1 1.1594e+14 1.2100e+16 14928
## - NBA_DraftNumber  1 6.5690e+14 1.2641e+16 14949
## - MP               1 9.8877e+14 1.2973e+16 14961
## - G                1 1.1071e+15 1.3091e+16 14966
## - Age              1 2.2380e+15 1.4222e+16 15006
## 
## Step:  AIC=14923.78
## Salary ~ NBA_DraftNumber + Age + G + MP + PER + X3PAr + ORB. + 
##     TRB. + USG. + WS + OBPM + VORP
## 
##                   Df  Sum of Sq        RSS   AIC
## - VORP             1 3.5447e+13 1.2043e+16 14923
## <none>                          1.2007e+16 14924
## - X3PAr            1 7.6377e+13 1.2084e+16 14925
## - WS               1 8.1813e+13 1.2089e+16 14925
## - PER              1 1.0378e+14 1.2111e+16 14926
## - OBPM             1 1.0573e+14 1.2113e+16 14926
## - ORB.             1 1.0859e+14 1.2116e+16 14926
## - USG.             1 1.1926e+14 1.2126e+16 14927
## - TRB.             1 2.3228e+14 1.2239e+16 14931
## - NBA_DraftNumber  1 6.6587e+14 1.2673e+16 14948
## - MP               1 9.6566e+14 1.2973e+16 14959
## - G                1 1.0977e+15 1.3105e+16 14964
## - Age              1 2.2414e+15 1.4249e+16 15004
## 
## Step:  AIC=14923.2
## Salary ~ NBA_DraftNumber + Age + G + MP + PER + X3PAr + ORB. + 
##     TRB. + USG. + WS + OBPM
## 
##                   Df  Sum of Sq        RSS   AIC
## <none>                          1.2043e+16 14923
## - X3PAr            1 8.1804e+13 1.2124e+16 14924
## - ORB.             1 1.2227e+14 1.2165e+16 14926
## - PER              1 1.3025e+14 1.2173e+16 14926
## - OBPM             1 1.3257e+14 1.2175e+16 14926
## - USG.             1 1.3897e+14 1.2182e+16 14927
## - TRB.             1 2.6687e+14 1.2310e+16 14932
## - NBA_DraftNumber  1 6.5783e+14 1.2700e+16 14947
## - WS               1 6.9027e+14 1.2733e+16 14948
## - MP               1 9.6191e+14 1.3005e+16 14958
## - G                1 1.3853e+15 1.3428e+16 14974
## - Age              1 2.2154e+15 1.4258e+16 15003
## 
## Call:
## lm(formula = Salary ~ NBA_DraftNumber + Age + G + MP + PER + 
##     X3PAr + ORB. + TRB. + USG. + WS + OBPM, data = nbaNumericas)
## 
## Coefficients:
##     (Intercept)  NBA_DraftNumber              Age                G  
##        -3893333           -62168           511716          -159255  
##              MP              PER            X3PAr             ORB.  
##            5204          -320540         -3013992          -201694  
##            TRB.             USG.               WS             OBPM  
##          333889           130873           845245           550301

Con un AIC de 1492, el modelo obtenido mediante stepwise backward es el siguiente

modeloStepBack <- lm(
  formula = Salary ~ NBA_DraftNumber + Age + G + MP + PER + 
    X3PAr + ORB. + TRB. + USG. + WS + OBPM, data = nbaNumericas)

5 Evaluación del modelo

A continuación algunas medidas del modelo

summary(modeloStepBack)
## 
## Call:
## lm(formula = Salary ~ NBA_DraftNumber + Age + G + MP + PER + 
##     X3PAr + ORB. + TRB. + USG. + WS + OBPM, data = nbaNumericas)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -15532214  -3017494   -365840   2303991  21608017 
## 
## Coefficients:
##                   Estimate Std. Error t value Pr(>|t|)    
## (Intercept)     -3893332.9  2785355.5  -1.398  0.16284    
## NBA_DraftNumber   -62168.3    12256.4  -5.072 5.66e-07 ***
## Age               511716.1    54973.9   9.308  < 2e-16 ***
## G                -159255.3    21635.8  -7.361 8.21e-13 ***
## MP                  5204.0      848.4   6.134 1.82e-09 ***
## PER              -320540.0   142016.8  -2.257  0.02446 *  
## X3PAr           -3013991.7  1685020.0  -1.789  0.07431 .  
## ORB.             -201694.2    92231.2  -2.187  0.02925 *  
## TRB.              333889.2   103347.8   3.231  0.00132 ** 
## USG.              130872.7    56136.5   2.331  0.02016 *  
## WS                845245.2   162676.1   5.196 3.04e-07 ***
## OBPM              550301.3   241673.6   2.277  0.02323 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 5057000 on 471 degrees of freedom
## Multiple R-squared:  0.5435, Adjusted R-squared:  0.5329 
## F-statistic: 50.98 on 11 and 471 DF,  p-value: < 2.2e-16

El modelo tiene un error estandar de la regresion bastane grande, y aunque la media de los resiudos no es demasiado elevada, la distribución de los mismos si lo es. Por ello, a continuación se realiza más ingenieria de variables, con el fin de mejorar la estimación

5.1 Ingeniería de variables II

5.1.1 Draft por grupos

A continuación se secciona la variable draft en 6 grupos de unas 10 posiciones en cada grupo, con el objetivo de ver su influencia en el salari, y como puede afectar al modelo introducir una variable que contraste la pertenencia a cada grupo.

# Primero string encoding
# Se crea una nueva variable para cada intervalo de 10 drafteados
nba <- nba %>% 
  mutate(draft_group = 
                 case_when(
                   NBA_DraftNumber >= 1 & 
                     NBA_DraftNumber <= 10 ~ "[1-10]",
                   
                   NBA_DraftNumber >= 11 & 
                     NBA_DraftNumber <= 20 ~ "[11-20]",
                   
                   NBA_DraftNumber >= 21 & 
                     NBA_DraftNumber <= 30 ~ "[21-30]",
                   
                   NBA_DraftNumber >= 31 & 
                     NBA_DraftNumber <= 40 ~ "[31-40]",
                   
                   NBA_DraftNumber >= 41 & 
                     NBA_DraftNumber <= 50 ~ "[41-50]",
                   
                   NBA_DraftNumber >= 51 ~ "[51-70]"))

# paso a factor
nba$draft_group <- as.factor(nba$draft_group)

# Grafico respecto a grupos
ggplotly(
  ggplot(nba, aes(x = draft_group, y = Salary, fill = draft_group)) +
    geom_boxplot() +
    scale_y_log10() +
    labs(title = "Salario vs. draft",
         y = "Salario", 
         x = "Grupo de draft",
         fill = NULL) +
    theme_minimal() 
) 
# Diagramas de violin 
ggplotly(
  ggplot(nba, aes(x = draft_group, y = Salary, fill = draft_group)) +
    geom_violin() +
    scale_y_log10() +
    labs(title = "Salario vs. draft",
         y = "Salario", 
         x = "Grupo de draft",
         fill = NULL) +
    theme_minimal() 
) 

Se representan los salarios en escala logarítmica para poder apreciar mejor la tendencia. Existe una tendencia decreciente en los salarios medios y medianos a media que el grupo de draft es más alto, es decir, los que se han drafteado más tarde. No obstante, los salarios máximos no varían especialmente, y los mínimos bajan, aunque no es una tendencia constante. Los diagramas de violines muestran como el salario es mucho más disperso en el último grupo.

A continuación se genera la variable dummy para la pertenencia al grupo con salario más alto, el de los 10 primeros drafteados.

nba <- nba %>% 
  mutate(draftDummy = ifelse(draft_group == "[1-10]", 1, 0))

5.1.2 Minutos jugados

La variable MP recoge cuantos minutos ha jugado cada jugador a lo largo de la temporada. Examinando los datos, podemos ver que existen jugadores que han jugado menos de 82 minutos en la temporada, lo que equivaldríaa a jugar un minuto por partido.

# Listado de los de menos de 82
nba %>% 
  filter(MP < 82) %>% 
  dplyr::select(Player, Salary, MP) %>% 
  arrange(desc(Salary))
##                  Player   Salary MP
## 1        Gordon Hayward 29727900  5
## 2           Joakim Noah 17765000 40
## 3             Luol Deng 17190000 13
## 4            Jeremy Lin 12000000 25
## 5          Cole Aldrich  7300000 46
## 6        Josh McRoberts  6021175  6
## 7         Alan Williams  6000000 70
## 8            Josh Smith  5400000 12
## 9          Kyle Singler  4666500 59
## 10 Mindaugas Kuzminskas  3025035  2
## 11        Udonis Haslem  2328652 72
## 12        Nick Collison  2328652 72
## 13        Justin Patton  2247480  4
## 14          D.J. Wilson  2135040 69
## 15         Wade Baldwin  1874400 29
## 16          Jeff Withey  1577320 39
## 17       Furkan Korkmaz  1465920 69
## 18         Tony Bradley  1414920 29
## 19          Okaro White  1312611 80
## 20     Nicolas Brussino  1312611 10
## 21           Kay Felder  1312611  3
## 22        Joel Bolomboy  1312611 38
## 23         Damian Jones  1312611 54
## 24         Ike Anigbogu   950000 28
## 25        Thomas Bryant   815615 34
## 26     Alfonzo McKinnie   815615 49
## 27      Jordan Crawford   250000 37
## 28           Larry Drew   148318 70
## 29       David Stockton   148318  6
## 30         Jeremy Evans   104059  5
## 31     Derrick Williams   104059  9
## 32     Marshall Plumlee   100000 52
## 33        Georges Niang   100000 18
## 34    Demetrius Jackson    92858 17
## 35          Nigel Hayes    92160 60
## 36      Naz Mitrou-Long    92160  1
## 37       MarShon Brooks    86119 76
## 38       Marquis Teague    83129 74
## 39         Jarell Eddie    83129  9
## 40         Xavier Silas    74159  7
## 41        Scotty Hopson    74159  8
## 42         Vince Hunter    50000  7
## 43          Vander Blue    50000 45
## 44         Nate Wolters    50000 19
## 45        Matt Williams    50000 11
## 46         Luis Montero    50000  8
## 47 James Michael McAdoo    50000 18
## 48         Jacob Pullen    50000  6
## 49         Gian Clavell    50000 64
## 50        Jameel Warney    46080 27

Vemos como pese ha jaber jugado tan poco, los salarios son abultados. Teniendo en cuenta que esta variable pertenece al modelo, es posible que estos datos estén dificultando el ajuste. En este contexto, se crea una variable que analice el salario por minutos jugados, con el fin de tener un criterio comparativo.

nba <- nba %>% mutate(
  salarioPorMinuto = Salary / MP
)

mean(nba$salarioPorMinuto) # 33911.81 de media 
## [1] 33911.81
summary(nba$salarioPorMinuto) # el maximo es muy abultado 
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     127    1862    4545   33912    9389 5945580

Con esta variable, se vuelve a filtrar el dataset. El filtro incluye aquellos jugadores cuyo salario por minuto es tres veces superior a la media del salario por minuto del dataset

nba %>% 
  filter(salarioPorMinuto > (3*sd(salarioPorMinuto))) %>% 
  dplyr::select(Player, Salary, salarioPorMinuto, MP) %>% 
  arrange(desc(salarioPorMinuto))
##                 Player   Salary salarioPorMinuto MP
## 1       Gordon Hayward 29727900          5945580  5
## 2 Mindaugas Kuzminskas  3025035          1512518  2
## 3            Luol Deng 17190000          1322308 13
## 4       Josh McRoberts  6021175          1003529  6
# Recojo estos nombres 
nombresOutlier <- c("Gordon Hayward", 
                    "Mindaugas Kuzminskas", 
                    "Luol Deng",
                    "Josh McRoberts")

Con los nombres de esos jugadores, se filtra el dataset original, para eliminarlos.

nba <- nba[!nba$Player %in% nombresOutlier, ] 
# seleccion de todos los que NO son 

5.2 Refinado de modelos

Finalmente, se vuelve a evaluar el modelo sobre estos datos, primero el modelo obtenido mediante Stepwise Backward, y luego este mismo modelo con la variable dummy del grupo del draft

# El modelo obtenido con step, pero sobre los datos retocados
modeloStepBack2 <- lm(
  formula = Salary ~ NBA_DraftNumber + Age + G + MP + PER + 
    X3PAr + ORB. + TRB. + USG. + WS + OBPM, data = nba)

# El mismo modelo, pero con la dummy de draft
modeloStepBackDraft <- lm(
  formula = Salary ~ draftDummy + Age + G + MP + PER + 
    X3PAr + ORB. + TRB. + USG. + WS + OBPM, data = nba)

Aunque el primer modelo (StepBack2) es igual al anterior, se guarda con otro nombre, para poder compararlo y ver si ha servido de algo retocar los datos

AIC(modeloStepBack, modeloStepBack2, modeloStepBackDraft)
##                     df      AIC
## modeloStepBack      13 16295.90
## modeloStepBack2     13 16140.82
## modeloStepBackDraft 13 16145.52

El modelo con mejor AIC es el segundo, es decir, el modelo sugerido por el Stewise Backward, pero evaluado sobre los datos retocados. Esto indica que la eliminación de esos datos ha mejorado el modelo. No obstante, es necesario recordar que es el modelo el que tiene que ajustarse a los datos, y no al reves.

summary(modeloStepBack2)
## 
## Call:
## lm(formula = Salary ~ NBA_DraftNumber + Age + G + MP + PER + 
##     X3PAr + ORB. + TRB. + USG. + WS + OBPM, data = nba)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -15483389  -2926541   -274616   2253041  20365505 
## 
## Coefficients:
##                   Estimate Std. Error t value Pr(>|t|)    
## (Intercept)     -4180409.1  2739593.3  -1.526  0.12771    
## NBA_DraftNumber   -55517.5    12131.8  -4.576 6.08e-06 ***
## Age               501047.0    54025.7   9.274  < 2e-16 ***
## G                -147921.2    21430.9  -6.902 1.68e-11 ***
## MP                  5044.6      837.1   6.026 3.41e-09 ***
## PER              -370908.5   140530.8  -2.639  0.00858 ** 
## X3PAr           -3244205.1  1662338.1  -1.952  0.05158 .  
## ORB.             -171792.7    90891.8  -1.890  0.05937 .  
## TRB.              337956.7   102924.4   3.284  0.00110 ** 
## USG.              162788.5    57951.4   2.809  0.00518 ** 
## WS                836548.4   161328.8   5.185 3.22e-07 ***
## OBPM              632390.9   238584.1   2.651  0.00831 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 4951000 on 467 degrees of freedom
## Multiple R-squared:  0.555,  Adjusted R-squared:  0.5445 
## F-statistic: 52.95 on 11 and 467 DF,  p-value: < 2.2e-16

El modelo sigue teniendo problemas de precisión, aunque se han reducido ligeramente.

6 Evaluación del modelo final

Para probar el modelo final, se elige una muestra de los datos. Se fija una semilla con el valor 123 para posibilitar la reproductibilidad de la muestra

set.seed(123)


prediccion <- predict(modeloStepBack2, 
                      # Muestra del 25% del dataset
                       sample_frac(nba, 0.25), 
                       se.fit = TRUE)
# Con se.fit = TRUE se muestran los valores estimados 
 
prediccion$residual.scale
## [1] 4950825

El error del modelo sobre la muestra sobre la que se predice es similar al obtenido en la evaluación del modelo sobre el dataset. No obstante, sigue habiendo un error muy elevado.

7 Conclusiones

El modelo que mejor estima los salarios de los jugadores de la NBA es el siguiente:

\[ Salario = NBA_DraftNumber + Age + G + MP + PER + X3PAr + ORB. + TRB. + USG. + WS + OBPM \]

Con todo, el modelo deja bastante que desear en cuanto a capacidad predictiva y precision, pero no ha sido posible encontrar un modelo mejor. No obstante, se pone de manifiesto que mediante la ingeniería de variables es posible modificar la forma de los predictores del modelo, mejorando así su precisión. Estas ténicas permiten también introducir variables categóricas en el modelo, que pueden resultar enrriquecedoras en cuanto a la capacidad predictiva del mismo